package persistencia;

import bitclub.Cliente;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author Bit Company
 */
public class PCliente {

    /**
     * Introduce un nuevo cliente en la base de datos
     */
    public static void nuevoBD(Cliente cliente) {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");

        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            statement = connection.createStatement();

            //Ciertos campos requieren tratamiento previo para pasarlo a String

            Date dateNacimiento = cliente.getNacimiento();
            String stringNacimiento = dateFormat.format(dateNacimiento);

            Date dateFechaAlta = cliente.getFechaAlta();
            String stringFechaAlta = dateFormat.format(dateFechaAlta);

            int activo = cliente.isActivo() ? 1 : 0;

            //Pasamos el INSERT a la base de datos

            statement.executeUpdate("INSERT INTO clientes (dni, password, nombre, "
                    + "apellidos, direccion, localidad, cp, f_nacimiento, email, "
                    + "tfno_f, tfno_m, sexo, fecha_alta, activo, saldo) values ('"
                    + cliente.getDni() + "', '" + cliente.getPassword() + "', '"
                    + cliente.getNombre() + "', '" + cliente.getApellidos() + "', '"
                    + cliente.getDireccion() + "', '" + cliente.getLocalidad() + "', '"
                    + cliente.getCodigoPostal() + "', '" + stringNacimiento + "', '"
                    + cliente.getMail() + "', '" + cliente.getTel_fijo() + "', '"
                    + cliente.getTel_movil() + "', '" + cliente.getSexo() + "', '"
                    + stringFechaAlta + "', " + activo + ", " + cliente.getSaldo() + ")");

            //Asignamos el ID con el que se guardó en la base de datos

            resultSet = statement.executeQuery("SELECT ID FROM CLIENTES ORDER BY ID DESC");
            if (resultSet.next()) {
                cliente.setId(resultSet.getInt("id"));
            }

        } catch (Exception ex) {
            System.out.println(ex.toString());
        } finally {
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }
    }

    /**
     * Actualiza los datos de un cliente en la base de datos
     */
    public static void actualizarBD(Cliente cliente) {
        Connection connection = null;
        Statement statement = null;

        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");

        try {

            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            statement = connection.createStatement();

            //Ciertos campos requieren tratamiento previo para pasarlo a String

            Date dateNacimiento = cliente.getNacimiento();
            String stringNacimiento = dateFormat.format(dateNacimiento);

            Date dateFechaAlta = cliente.getFechaAlta();
            String stringFechaAlta = dateFormat.format(dateFechaAlta);

            Date dateFechaBaja = cliente.getFechaBaja();
            String stringFechaBaja;
            if (dateFechaBaja == null) {
                stringFechaBaja = "null";
            } else {
                stringFechaBaja = "'" + dateFormat.format(dateFechaAlta) + "'";
            }

            int activo = cliente.isActivo() ? 1 : 0;

            //Pasamos el UPDATE a la base de datos
            
            statement.executeUpdate("UPDATE CLIENTES SET DNI = '" + cliente.getDni()
                    + "', PASSWORD = '" + cliente.getPassword() + "', NOMBRE = '" + cliente.getNombre()
                    + "', APELLIDOS = '" + cliente.getApellidos() + "', DIRECCION = '" + cliente.getDireccion()
                    + "', LOCALIDAD =  '" + cliente.getLocalidad() + "', CP = '" + cliente.getCodigoPostal()
                    + "', F_NACIMIENTO = '" + stringNacimiento + "', EMAIL = '" + cliente.getMail()
                    + "', TFNO_F =  '" + cliente.getTel_fijo() + "', TFNO_M =  '" + cliente.getTel_movil()
                    + "', SEXO = '" + cliente.getSexo() + "', FECHA_ALTA = '" + stringFechaAlta
                    + "', FECHA_BAJA = " + stringFechaBaja + ", ACTIVO = " + activo + ", "
                    + "SALDO = " + cliente.getSaldo() + " WHERE ID = " + cliente.getId());

        } catch (Exception ex) {
            System.out.println(ex.toString());
        } finally {
            try {
                statement.close();
                connection.close();
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }

    }

    /**
     * Devuelve una lista de clientes cuyo nombre o apellido coincida con cierto patron
     * @param nombre o apellido
     * @return List<Cliente>
     */
    public static List<Cliente> seleccionarPorNombreBD(String nombre) {
        List<Cliente> listCliente = new ArrayList();
        String sql="SELECT ID, DNI, PASSWORD, NOMBRE, APELLIDOS, DIRECCION, LOCALIDAD, CP , F_NACIMIENTO, EMAIL, TFNO_F, TFNO_M, SEXO, FECHA_ALTA, FECHA_BAJA, ACTIVO, SALDO FROM CLIENTES WHERE NOMBRE LIKE '%" + nombre + "%'";
        listCliente=seleccionarBD(sql);
        return listCliente;
    }

    /**
     * Devuelve el cliente cuyo dni se corresponda con el parámetro
     * @param dni
     * @return Cliente
     */
    public static Cliente seleccionarPorDniBD(String dni) {
        List<Cliente> listCliente = new ArrayList();
        String sql="SELECT ID, DNI, PASSWORD, NOMBRE, APELLIDOS, DIRECCION, LOCALIDAD, CP , F_NACIMIENTO, EMAIL, TFNO_F, TFNO_M, SEXO, FECHA_ALTA, FECHA_BAJA, ACTIVO, SALDO FROM CLIENTES WHERE DNI = '" + dni + "'";
        listCliente=seleccionarBD(sql);
        if(listCliente.isEmpty()){
            return null;
        }else{
            return listCliente.get(0);
        }
    }

    /**
     * Devuelve el cliente cuyo número de cliente se corresponda con el parámetro
     * @param numCliente Número de cliente
     * @return Cliente
     */
    public static Cliente seleccionarPorNumClienteBD(int numCliente) {
        List<Cliente> listCliente = new ArrayList();
        String sql="SELECT ID, DNI, PASSWORD, NOMBRE, APELLIDOS, DIRECCION, LOCALIDAD, CP , F_NACIMIENTO, EMAIL, TFNO_F, TFNO_M, SEXO, FECHA_ALTA, FECHA_BAJA, ACTIVO, SALDO FROM CLIENTES WHERE ID = '" + numCliente + "'";
        listCliente=seleccionarBD(sql);
        if(listCliente.isEmpty()){
            return null;
        }else{
            return listCliente.get(0);
        }

    }
        
    public static List<Cliente> seleccionarBD(String sql) {
        //Lista de clientes que devolveremos
        List<Cliente> listCliente = new ArrayList();

        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

        try {
            Cliente cliente = null;

            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            statement = connection.createStatement();
            resultSet = statement.executeQuery(sql);

            while (resultSet.next()) {
                
                cliente=new Cliente();

                cliente.setId(resultSet.getInt("id"));
                cliente.setDni(resultSet.getString("dni"));
                cliente.setPassword(resultSet.getString("password"));
                cliente.setNombre(resultSet.getString("nombre"));
                cliente.setApellidos(resultSet.getString("apellidos"));
                cliente.setDireccion(resultSet.getString("direccion"));
                cliente.setLocalidad(resultSet.getString("localidad"));
                cliente.setCodigoPostal(resultSet.getString("cp"));
                cliente.setNacimiento(dateFormat.parse(resultSet.getString("f_nacimiento")));
                cliente.setMail(resultSet.getString("email"));
                cliente.setTel_fijo(resultSet.getString("tfno_f"));
                cliente.setTel_movil(resultSet.getString("tfno_m"));
                cliente.setSexo(resultSet.getString("sexo").charAt(0));
                cliente.setFechaAlta(dateFormat.parse(resultSet.getString("fecha_alta")));
                if (resultSet.getString("fecha_baja") == null) {
                    cliente.setFechaBaja(null);
                } else {
                    cliente.setFechaBaja(dateFormat.parse(resultSet.getString("fecha_baja")));
                }
                cliente.setSaldo(resultSet.getDouble("saldo"));

                if (resultSet.getInt("activo") == 1) {
                    cliente.setActivo(true);
                } else {
                    cliente.setActivo(false);
                }
                
                //Cliente construido y lo añadimos a la lista
                listCliente.add(cliente);

            }

        } catch (Exception ex) {
            System.out.println(ex.toString());
        } finally {
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }
        return listCliente;

    }
    
}